package collectionFrame.Demo7_LinkedListExample;

import java.time.LocalDate;
import java.util.*;

public class WXRedPacket {

    public static void main(String[] args) {
        RedPacket redPacket = new RedPacket();
        //发送红包并且获得发送的结果
        boolean sendSuccFlag = redPacket.sendPacket(200, 5);

        //如果发送成功，可以抢红包
        if(sendSuccFlag){
            redPacket.receivePacket("tom");
            redPacket.receivePacket("jerry");
            redPacket.receivePacket("tom");
            redPacket.receivePacket("kitty");
            redPacket.receivePacket("kaikai");
            redPacket.receivePacket("良心");
            redPacket.receivePacket("aaa");
            redPacket.receivePacket("bbb");
        }else{
            System.out.println("红包发送失败，请重新发送");
        }

        System.out.println(redPacket.getSortedResult());

    }

}

class RedPacket{

    //红包的总钱数
    private double money;
    //红包的总个数
    private int count;
    //红包的超时时间，根据实际情况可以使用字符串类型或者是时间类型
    private LocalDate timeout;

    //已被抢走的红包数
    int size = 0;

    //初始化存储已经完成抢红包操作的人员信息列表
    //TODO 此处比较适合使用 HashMap
    List<String> list_received = new ArrayList<>();

    //定义一个随机数的对象
    Random rand = new Random();

    //初始化一个接收到的红包钱数
    double receiveMoney = 0;


    /**
     * 发送红包的方法
     * @param money
     * @param count
     * @return
     */
    public boolean sendPacket(double money,int count){

        //可以判断发送失败的情况(自定义)
        if(money>200 || (count*0.1)>money){
            System.out.println("金额不能超过200或金额不足");
            return false;
        }

        this.money = money;
        this.count = count;
        //以发送红包那个时刻的系统时间加1天作为红包过期的超时时间
        this.timeout = LocalDate.now().plusDays(1);

        System.out.println("红包发送成功");
        System.out.println("共"+this.money+"元，共"+this.count+"个红包");
        System.out.println("=====现在可以开始抢红包了=====");
        System.out.println("=======================================================");
        return true;
    }

    /**
     * 抢红包的方法
     *   可以抢红包的条件
     *      1.红包有剩余
     *        size<count
     *      2.当前人没有抢过红包
     *        每个抢到红包的人结束后需要把结果存入集合(1.判断是否重复 2.做排序)
     *      3.抢红包时的系统时间没有超过 超时时间
     *        获取当前时间与超时时间做对比
     * @param name 抢红包的人
     */
    public void receivePacket(String name){

        //抢红包时的系统时间
        LocalDate receiveTime = LocalDate.now();

        //如果当前时间没有超过系统时间可以继续
        if (receiveTime.isBefore(this.timeout)) {
            //如果红包还有剩余可以继续
            if(this.size < this.count){
                //如果列表不为空的时候进行遍历判断
                if(null!=list_received && list_received.size()>0){
                    boolean b = true;
                    for (int i = 0; i < list_received.size(); i++) {
                        if(list_received.get(i).contains(name)){
                            System.out.println(name+"已经抢过此红包了");
                            b = false;
                            break;
                        }
                    }
                    //如果列表中没有此姓名可以继续抢红包
                    if(b){
                        getReceiveMoney(name);
                    }
                }else{
                    //如果是第一个人的时候，列表中还没有数据，空列表无法循环直接开抢
                    getReceiveMoney(name);
                }
            }else{
                System.out.println("红包已经被抢空了");
            }
        }else{
            System.out.println("红包已经过期");
        }
    }


    /**
     * 封装一个随机一个红包钱数的方法
     * @param name
     */
    private void getReceiveMoney(String name){
        //总钱数在每一次抢完红包后都需要发生变化
        this.money -= this.receiveMoney;

        //判断此人是否为最后一个抢红包的人
        if(this.size<this.count-1){
            //利用随机 数抽取此人的钱数
            this.receiveMoney = rand.nextDouble()*this.money;

            //TODO 功能不完善
            //做每次抢红包的钱数的判断 比如不能小于1分钱，不能超过某个上限
            while(this.receiveMoney<0.01 || this.receiveMoney>=this.money/2*1.5){
                this.receiveMoney = rand.nextDouble()*this.money;
            }
        }else {
            //最后一个红包的金额不能通过随机的形式产生，剩多少钱就给多少钱
            this.receiveMoney = this.money;
        }

        //把double类型转成保留两位小数的字符串形式
        String tempMoney = String.format("%.2f",this.receiveMoney);

        System.out.println(name+"抢到了"+tempMoney+"元");

        list_received.add(name+"#"+tempMoney);

        this.size++;

    }

    public List<String> getSortedResult(){
        Collections.sort(list_received, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                double thisMoney = Double.parseDouble(o1.split("#")[1]);
                double thatMoney = Double.parseDouble(o2.split("#")[1]);

                return (int)(thatMoney-thisMoney);
            }
        });

        return list_received;
    }


    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public LocalDate getTimeout() {
        return timeout;
    }

    public void setTimeout(LocalDate timeout) {
        this.timeout = timeout;
    }
}
